{smcl}
{* 09jul2020}{...}
{cmd:help mata mm_group()}
{hline}

{title:Title}

{p 4 10 2}
{bf:mm_group() -- Create group index}


{title:Syntax}

{p 8 23 2}
{it:real colvector}
{cmd:mm_group(}{it:transmorphic matrix X} [{cmd:,} {it:real rowvector idx}]{cmd:)}

{p 8 23 2}
{it:real colvector}
{cmd:_mm_group(}{it:transmorphic matrix X}{cmd:)}


{title:Description}

{pstd}
{cmd:mm_group()} returns a row vector taking on values 1, 2, ... for the groups
formed by the unique rows of {it:X}. By default, the values will be assigned based on
an ascending sort order of {it:X}. However, the returned values will be in the original order
of {it:X}.

{pstd}
Specify argument {it:idx} to select the relevant columns of {it:X} and determine their
sort direction. For example, {it:idx} = {cmd:(4,1)} will assign groups based on
columns 4 and 1, in ascending order. Use negative values to request descending sort
order. For example, {it:idx} = {cmd:(2,-5)} would create groups based on
columns 2 and 5, using a descending sort order for column 5 (within values of
column 2). The default is to use all columns of {it:X} and use ascending sort order.

{pstd}
{cmd:_mm_group()} returns a row vector taking on values 1, 2, ... for the groups
formed by consecutive rows of {it:X}, without sorting {it:X}.


{title:Examples}

    {com}: X = ("a", "a") \
    >     ("a", "c") \
    >     ("a", "b") \
    >     ("b", "a") \
    >     ("b", "a") \
    >     ("a", "a") \
    >     ("b", "c")
    {res}
    {com}: mm_group(X, 1)
    {res}       {txt}1
        {c TLC}{hline 5}{c TRC}
      1 {c |}  {res}1{txt}  {c |}
      2 {c |}  {res}1{txt}  {c |}
      3 {c |}  {res}1{txt}  {c |}
      4 {c |}  {res}2{txt}  {c |}
      5 {c |}  {res}2{txt}  {c |}
      6 {c |}  {res}1{txt}  {c |}
      7 {c |}  {res}2{txt}  {c |}
        {c BLC}{hline 5}{c BRC}

    {com}: mm_group(X, 2)
    {res}       {txt}1
        {c TLC}{hline 5}{c TRC}
      1 {c |}  {res}1{txt}  {c |}
      2 {c |}  {res}3{txt}  {c |}
      3 {c |}  {res}2{txt}  {c |}
      4 {c |}  {res}1{txt}  {c |}
      5 {c |}  {res}1{txt}  {c |}
      6 {c |}  {res}1{txt}  {c |}
      7 {c |}  {res}3{txt}  {c |}
        {c BLC}{hline 5}{c BRC}

    {com}: mm_group(X)
    {res}       {txt}1
        {c TLC}{hline 5}{c TRC}
      1 {c |}  {res}1{txt}  {c |}
      2 {c |}  {res}3{txt}  {c |}
      3 {c |}  {res}2{txt}  {c |}
      4 {c |}  {res}4{txt}  {c |}
      5 {c |}  {res}4{txt}  {c |}
      6 {c |}  {res}1{txt}  {c |}
      7 {c |}  {res}5{txt}  {c |}
        {c BLC}{hline 5}{c BRC}

    {com}: mm_group(X, -1)
    {res}       {txt}1
        {c TLC}{hline 5}{c TRC}
      1 {c |}  {res}2{txt}  {c |}
      2 {c |}  {res}2{txt}  {c |}
      3 {c |}  {res}2{txt}  {c |}
      4 {c |}  {res}1{txt}  {c |}
      5 {c |}  {res}1{txt}  {c |}
      6 {c |}  {res}2{txt}  {c |}
      7 {c |}  {res}1{txt}  {c |}
        {c BLC}{hline 5}{c BRC}

    {com}: _mm_group(X)
    {res}       {txt}1
        {c TLC}{hline 5}{c TRC}
      1 {c |}  {res}1{txt}  {c |}
      2 {c |}  {res}2{txt}  {c |}
      3 {c |}  {res}3{txt}  {c |}
      4 {c |}  {res}4{txt}  {c |}
      5 {c |}  {res}4{txt}  {c |}
      6 {c |}  {res}5{txt}  {c |}
      7 {c |}  {res}6{txt}  {c |}
        {c BLC}{hline 5}{c BRC}

    {com}: _mm_group(X[,1])
    {res}       {txt}1
        {c TLC}{hline 5}{c TRC}
      1 {c |}  {res}1{txt}  {c |}
      2 {c |}  {res}1{txt}  {c |}
      3 {c |}  {res}1{txt}  {c |}
      4 {c |}  {res}2{txt}  {c |}
      5 {c |}  {res}2{txt}  {c |}
      6 {c |}  {res}3{txt}  {c |}
      7 {c |}  {res}4{txt}  {c |}
        {c BLC}{hline 5}{c BRC}{txt}


{title:Conformability}

    {cmd:mm_group(}{it:X}{cmd:,} {it:idx}{cmd:)}
                  {it:X}:  {it:r x c1}
                {it:idx}:  1 {it:x c2}, {it:c2} <= {it:c1}
             {it:result}:  {it:r x} 1

    {cmd:_mm_group(}{it:X}{cmd:)}
                  {it:X}:  {it:r x c}
             {it:result}:  {it:r x} 1


{title:Diagnostics}

{pstd}
{cmd:mm_group()} aborts with error if any element of {cmd:abs(}{it:idx}{cmd:)}
is 0 or greater than {cmd:cols(}{it:X}{cmd:)}.


{title:Source code}

{pstd}
{help moremata_source##mm_group:mm_group.mata}


{title:Author}

{pstd} Ben Jann, University of Bern, ben.jann@soz.unibe.ch


{title:Also see}

{psee}
Online:  help for
{bf:{help mf_sort:[M-5] sort()}},
{bf:{help mf_uniqrows:[M-5] uniqrows()}},
{helpb mf_mm_nunique:mm_nunique()},
{bf:{help moremata}}
{p_end}
